package game;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JFrame;

import rps.RPSClient;

public class Bolera extends JFrame implements Runnable {

	private Modelo modeloBolos = new Modelo();

	private Image fondo;
	private Image bolos;
	private Image personaje;
	private Image bolosTumbados3D[];
	private Clip sonidoFondo;

	private boolean bImagenesCargadas = false;
	private PintarLienzo plienzo = new PintarLienzo(this);
	private Thread hilo = new Thread(this);

	private Image db = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
	private Graphics gdb = db.getGraphics();

	static RPSClient gc = null;
	
	private static boolean bloqueado=false;
	static HashMap datosPersonaje= new HashMap();
		
	public Bolera(){
		
		addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent evt) {
				formWindowClosing(evt);
			}
		});
		
		setTitle("Bowling Net");
		java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit()
		.getScreenSize();
		setBounds((screenSize.width - 800) / 2, (screenSize.height - 600) / 2,
				800, 600);
		setVisible(true);
		try {
			sonidoFondo = AudioSystem.getClip();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}
		try {
			sonidoFondo.open(AudioSystem.getAudioInputStream(new File(
					"sonido/bolera.wav")));
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		}
		sonidoFondo.loop(Clip.LOOP_CONTINUOUSLY); // lo reproduce infinitamente.

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent windowEvent) {
				setDefaultCloseOperation(EXIT_ON_CLOSE);
				dispose();

			}
		});

		addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent keyEvent) {
				pulsaTecla();
			}
		});

		FactoriaImagenes fi = new FactoriaImagenes(this);
		// imagen fondo
		fondo = Toolkit.getDefaultToolkit()
				.getImage("imagenes/imagenfondo.jpg");
		bolos = Toolkit.getDefaultToolkit().getImage("imagenes/pin.png");
		bolosTumbados3D = fi.generarImagenBoloTumbado3D();
		String personajeSel="";
		if((datosPersonaje.get("personaje")+"").equals("imagenes/per1_3.png"))
			personajeSel="imagenes/cp1.png";
		if((datosPersonaje.get("personaje")+"").equals("imagenes/per2_3.png"))
			personajeSel= "imagenes/cp2.png";
		if((datosPersonaje.get("personaje")+"").equals("imagenes/per3_3.png"))
			personajeSel="imagenes/cp3.png";
		if((datosPersonaje.get("personaje")+"").equals("imagenes/per4_3.png"))
			personajeSel="imagenes/cp4.png";
		personaje = Toolkit.getDefaultToolkit().getImage(personajeSel);
		modeloBolos.iniciarPartida();
		bImagenesCargadas = true;
		hilo.start();
		repaint();
	}

	public void paint(Graphics g) {		
		if (bImagenesCargadas) {
			String personajeSel="";
			if((datosPersonaje.get("personaje")+"").equals("imagenes/per1_3.png"))
				personajeSel="imagenes/cp1.png";
			if((datosPersonaje.get("personaje")+"").equals("imagenes/per2_3.png"))
				personajeSel= "imagenes/cp2.png";
			if((datosPersonaje.get("personaje")+"").equals("imagenes/per3_3.png"))
				personajeSel="imagenes/cp3.png";
			if((datosPersonaje.get("personaje")+"").equals("imagenes/per4_3.png"))
				personajeSel="imagenes/cp4.png";
			personaje = Toolkit.getDefaultToolkit().getImage(personajeSel);
			gdb.drawImage(fondo, 0, 25, this);
			Bolo bb[] = modeloBolos.getBolos();
			for (Bolo b : bb) 
				plienzo.pintaBolo(gdb, bolos, bolosTumbados3D, b);
			plienzo.pintaFlecha(gdb, modeloBolos.getFlecha(), modeloBolos
					.getBola(), this);
			if (modeloBolos.getEstado() == Modelo.LANZANDO)
				plienzo.pintaBola(gdb, modeloBolos.getBola(), this);
			plienzo.pintaVelocidad(gdb, modeloBolos.getVelocidad());

			plienzo.pintarPuntuacion(gdb, modeloBolos.getPuntos(),gc);
			
			plienzo.pintarPersonaje(gdb, personaje, datosPersonaje.get("nick")+"");
			g.drawImage(db, 0, 0, this);
		}
	}

	public void run() {
		int nRetardo = 100;
		while (true) {
			try {
				Thread.sleep(nRetardo);
				modeloBolos.moverModelo();
				repaint();
			} catch (Exception e) {
			}
		}

	}

	public static void iniciarPartida(HashMap mapa,RPSClient client){		
		datosPersonaje=mapa;
		gc=client;
		System.out.println("iniciar partida mapa q llega: "+datosPersonaje);
		if((datosPersonaje.get("bloqueado")+"").equals("S"))
			bloqueado=true;
		else
			bloqueado=false;
		new Bolera();
	}
	
	public static void cambiarTurno(HashMap mapa)
	{
		datosPersonaje=mapa;
		if((datosPersonaje.get("bloqueado")+"").equals("S"))
			bloqueado=true;
		else
			bloqueado=false;
		System.out.println("esta bloqueado: "+bloqueado+" mapa: "+datosPersonaje);
	}
	
	public void pulsaTecla() {
		if(!bloqueado)
		{	
			int estado = modeloBolos.getEstado();
			switch (estado) {
			case 0:
				modeloBolos.lanzarBola(gc,bloqueado);
				break;
			case 2:
				modeloBolos.iniciarPartida();
				break;
			}
		}
		else
			modeloBolos.setBloqueado(bloqueado);
	}
	
	private void formWindowClosing(java.awt.event.WindowEvent evt) {
		gc.salir();
	}
}
